library(googleAnalyticsR)
library(keyring)
library(ggplot2)
library(tidyverse)
library(lubridate)
library(ggpubr)
#Get data for FY2017-2018 for sessions and goal completions by date
seventeen_eighteen_app_values <- read_csv("../inputs/seventeen_eighteen_apps.csv")
Parsed with column specification:
cols(
  date = col_date(format = ""),
  month = col_character(),
  year = col_double(),
  dayofWeekName = col_character(),
  day = col_character(),
  goal9Completions = col_double(),
  sessions = col_double(),
  goal3Completions = col_double(),
  goal5Completions = col_double(),
  goal12Completions = col_double()
)
summary(seventeen_eighteen_app_values)
#Plot application values against month 
ggplot(seventeen_eighteen_app_values) +
  aes(x = month, y = goal9Completions) +
  geom_col() +
  geom_hline(yintercept = 45, colour = "red")

#Plot app values against day of week
ggplot(seventeen_eighteen_app_values) +
  aes(x = dayofWeekName, y = goal9Completions) +
  geom_col() 
#Plot app values  and sessions over entire year
app_seventeen_plot <- ggplot() +
  geom_line(data = seventeen_eighteen_app_values, 
           aes(x = date, y = goal9Completions)) +
  labs(x = "Date", y = "Applications")

sessions_seventeen_plot <- ggplot() +
  geom_line(data = seventeen_eighteen_app_values, 
           aes(x = date, y = sessions)) +
  labs(x = "Date", y = "Sessions")

ggarrange(sessions_seventeen_plot, app_seventeen_plot,
          ncol = 1, nrow = 2)
ggsave("seventeen_sessions.jpg")
Saving 7.29 x 4.51 in image

#Plot app values and info session clicks over entire year
goal3_seventeen <- ggplot() +
  geom_line(data = seventeen_eighteen_app_values, 
           aes(x = date, y = goal3Completions, colour = "blue")) +
  geom_line(data = seventeen_eighteen_app_values, 
           aes(x = date, y = goal5Completions, colour = "red")) +
  labs(x = "Date", y = "Info Session Clicks") +
  theme(legend.position = "none")

goal9_seventeen<- 
  ggplot()+
  geom_line(data = seventeen_eighteen_app_values, 
           aes(x = date, y = goal9Completions)) +
  labs(x = "Date", y = "Applications")

ggarrange(goal3_seventeen, goal9_seventeen,
          ncol = 1, nrow = 2)
ggsave("seventeen_goal35.jpg")
Saving 7.29 x 4.51 in image

#Plot app values  and info packs over entire year
info_packs_seventeen_plot <- ggplot() +
  geom_line(data = seventeen_eighteen_app_values, 
           aes(x = date, y = goal12Completions, colour = "blue")) +
  labs(x = "Date", y = "Info Pack Requests") +
   theme(legend.position = "none")

ggarrange(info_packs_seventeen_plot, goal9_seventeen,
          ncol = 1, nrow = 2)
ggsave("seventeen_goal12.jpg")
Saving 7.29 x 4.51 in image

#Get correlations between metrics and app values
cor(seventeen_eighteen_app_values$goal9Completions, seventeen_eighteen_app_values$sessions)
[1] 0.4036846
cor(seventeen_eighteen_app_values$goal9Completions, seventeen_eighteen_app_values$goal3Completions)
[1] 0.2278833
cor(seventeen_eighteen_app_values$goal9Completions, seventeen_eighteen_app_values$goal5Completions)
[1] 0.07772192
cor(seventeen_eighteen_app_values$goal9Completions, seventeen_eighteen_app_values$goal12Completions)
[1] 0.03673292

Strongest correlation between sessions and app values but weak - info packs not really correlated, too weak

#Get data for FY2018/2019
eighteen_nineteen_app_values <-  read_csv("../inputs/eighteen_nineteen_apps.csv")
Parsed with column specification:
cols(
  date = col_date(format = ""),
  month = col_character(),
  year = col_double(),
  dayofWeekName = col_character(),
  day = col_character(),
  goal9Completions = col_double(),
  sessions = col_double(),
  goal3Completions = col_double(),
  goal5Completions = col_double(),
  goal12Completions = col_double()
)
summary(eighteen_nineteen_app_values)
      date               month                year      dayofWeekName     
 Min.   :2018-04-01   Length:365         Min.   :2018   Length:365        
 1st Qu.:2018-07-01   Class :character   1st Qu.:2018   Class :character  
 Median :2018-09-30   Mode  :character   Median :2018   Mode  :character  
 Mean   :2018-09-30                      Mean   :2018                     
 3rd Qu.:2018-12-30                      3rd Qu.:2018                     
 Max.   :2019-03-31                      Max.   :2019                     
     day            goal9Completions    sessions     goal3Completions goal5Completions
 Length:365         Min.   :0.000    Min.   : 90.0   Min.   : 0.000   Min.   :0.00    
 Class :character   1st Qu.:0.000    1st Qu.:227.0   1st Qu.: 0.000   1st Qu.:0.00    
 Mode  :character   Median :1.000    Median :314.0   Median : 1.000   Median :2.00    
                    Mean   :1.115    Mean   :305.4   Mean   : 1.756   Mean   :2.06    
                    3rd Qu.:2.000    3rd Qu.:371.0   3rd Qu.: 3.000   3rd Qu.:3.00    
                    Max.   :8.000    Max.   :697.0   Max.   :15.000   Max.   :9.00    
 goal12Completions
 Min.   :0.000    
 1st Qu.:1.000    
 Median :2.000    
 Mean   :2.233    
 3rd Qu.:3.000    
 Max.   :8.000    
#Create data frame with both year's data
all_years_app_values <- 
rbind(seventeen_eighteen_app_values, eighteen_nineteen_app_values)

all_years_app_values <- 
all_years_app_values %>%
  mutate(FY = case_when(
    month %in% c("04", "05", "06", "07", "08", "09", "10", "11", "12") & year == "2017" ~ "2017/18",
    month %in% c("01", "02", "03") & year == "2018" ~ "2017/18",
    month %in% c("04", "05", "06", "07", "08", "09", "10", "11", "12") & year == "2018" ~ "2018/19",
    month %in% c("01", "02", "03") & year == "2019" ~ "2018/19",
  ))
sum(all_years_app_values$goal9Completions)
[1] 919
#Plot app values for each month and compare to last year
all_years_app_values %>%
  group_by(month, FY) %>%
  summarise(total_apps = sum(goal9Completions)) %>%
  ggplot() +
  geom_col(aes(x = month, y = total_apps, fill = FY), position = "dodge") +
  scale_fill_manual(values = c("violetred3", "springgreen3")) +
  geom_hline(yintercept = 45) +
  labs(title = "Applications per Month", x = "Month", y = "Number of Applications") +
  theme(title = element_text(size = 12, face = "bold"),
                  axis.title = element_text(size = 12, face = "bold"),
                  axis.text = element_text(size = 10),
                  legend.title = element_text(size = 10))
ggsave("apps_month.jpg")
Saving 7.29 x 4.51 in image

#Plot apps by day of the week and compare to last year
all_years_app_values %>%
  group_by(dayofWeekName, FY) %>%
  summarise(total_apps = sum(goal9Completions)) %>%
  ggplot() +
  geom_col(aes(x = reorder(dayofWeekName, total_apps), y = total_apps, fill = FY), position = "dodge") +
  scale_fill_manual(values = c("violetred3", "springgreen3")) +
  labs(title = "Applications per Week Day", x = "Day", y = "Number of Applications") +
  theme(title = element_text(size = 12, face = "bold"),
                  axis.title = element_text(size = 12, face = "bold"),
                  axis.text = element_text(size = 10),
                  legend.title = element_text(size = 10))
ggsave("apps_day.jpg")
Saving 7.29 x 4.51 in image

sum(seventeen_eighteen_app_values$goal9Completions)
[1] 512
sum(eighteen_nineteen_app_values$goal9Completions)
[1] 407
#Plot apps by day of the month and compare to last year
all_years_app_values %>%
  group_by(day, FY) %>%
  summarise(total_apps = sum(goal9Completions)) %>%
  ggplot() +
  geom_col(aes(x = day, y = total_apps, fill = FY), position = "dodge") +
  scale_fill_manual(values = c("violetred3", "springgreen3")) +
  labs(title = "Applications per Month Day", x = "Day of Month", y = "Number of Applications") +
  theme(title = element_text(size = 12, face = "bold"),
                  axis.title = element_text(size = 12, face = "bold"),
                  axis.text = element_text(size = 10),
                  legend.title = element_text(size = 10))
ggsave("apps_month_day.jpg")
Saving 7.29 x 4.51 in image

#Plot sessions vs apps for FY2018/19
app_eighteen_plot <- ggplot() +
  geom_line(data = eighteen_nineteen_app_values, 
           aes(x = date, y = goal9Completions))  +
  labs(x = "Date", y = "Applications")

sessions_eighteen_plot <- ggplot() +
  geom_line(data = eighteen_nineteen_app_values, 
           aes(x = date, y = sessions)) +
  labs(x = "Date", y = "Sessions")

ggarrange(sessions_eighteen_plot, app_eighteen_plot,
          ncol = 1, nrow = 2)
ggsave("eighteen_sessions.jpg")
Saving 7.29 x 4.51 in image

#Plot app values and info session clicks over entire year
info_clicks_eighteen_plot <- ggplot() +
  geom_line(data = eighteen_nineteen_app_values, 
           aes(x = date, y = goal3Completions, colour = "blue")) +
  geom_line(data = eighteen_nineteen_app_values, 
           aes(x = date, y = goal5Completions, colour = "red")) +
  labs(x = "Date", y = "Info Session Clicks") +
  theme(legend.position = "none")

goal9_eighteen_plot <- 
ggplot() +
   geom_line(data = eighteen_nineteen_app_values, 
           aes(x = date, y = goal9Completions)) +
labs(x = "Date", y = "Applications")

ggarrange(info_clicks_eighteen_plot, goal9_eighteen_plot,
          ncol = 1, nrow = 2)
ggsave("eighteen_goal35.jpg")
Saving 7.29 x 4.51 in image

#Plot app values  and info packs over entire year
info_packs_eighteen_plot <- ggplot() +
  geom_line(data = eighteen_nineteen_app_values, 
           aes(x = date, y = goal12Completions, colour = "red")) +
  labs(x = "Date", y = "Info Pack Requests") +
  theme(legend.position = "none")

ggarrange(info_packs_eighteen_plot, goal9_eighteen_plot,
          ncol = 1, nrow = 2)

ggsave("eighteen_goal12.jpg")
Saving 7.29 x 4.51 in image

#Get correlations between metrics and app values
cor(eighteen_nineteen_app_values$goal9Completions, eighteen_nineteen_app_values$sessions)
[1] 0.3057772
cor(eighteen_nineteen_app_values$goal9Completions, eighteen_nineteen_app_values$goal3Completions)
[1] 0.1224082
cor(eighteen_nineteen_app_values$goal9Completions, eighteen_nineteen_app_values$goal5Completions)
[1] 0.3110095
cor(eighteen_nineteen_app_values$goal9Completions, eighteen_nineteen_app_values$goal12Completions)
[1] 0.1509175
#Compare applications for each year
ggplot() +
  geom_line(data = seventeen_eighteen_app_values, aes(x = date, y = goal9Completions), colour = "violetred3") +
  geom_line(data = eighteen_nineteen_app_values, aes(x = date, y = goal9Completions), colour = "springgreen3") +
  labs(x = "Date", y = "Number of Applications") +
  theme(title = element_text(size = 12, face = "bold"),
                  axis.title = element_text(size = 12, face = "bold"),
                  axis.text = element_text(size = 10),
                  legend.title = element_text(size = 10))
ggsave("apps_2years.jpg")
Saving 7.29 x 4.51 in image

#Compare sessions for each year
ggplot() +
  geom_line(data = seventeen_eighteen_app_values, aes(x = date, y = sessions), colour = "violetred3") +
  geom_line(data = eighteen_nineteen_app_values, aes(x = date, y = sessions), colour = "springgreen3") +
  labs(x = "Date", y = "Number of Sessions") +
  theme(title = element_text(size = 12, face = "bold"),
                  axis.title = element_text(size = 12, face = "bold"),
                  axis.text = element_text(size = 10),
                  legend.title = element_text(size = 10))
ggsave("session_2years.jpg")
Saving 7.29 x 4.51 in image

#Compare info clicks for each year
ggplot() +
  geom_line(data = seventeen_eighteen_app_values, aes(x = date, y = goal3Completions), colour = "red") +
  geom_line(data = seventeen_eighteen_app_values, aes(x = date, y = goal5Completions), colour = "blue") +
  geom_line(data = eighteen_nineteen_app_values, aes(x = date, y = goal3Completions), colour = "yellow") +
  geom_line(data = eighteen_nineteen_app_values, aes(x = date, y = goal5Completions), colour = "green") +
  labs(x = "Date", y = "Number of Info Session Clicks") +
  theme(title = element_text(size = 12, face = "bold"),
                  axis.title = element_text(size = 12, face = "bold"),
                  axis.text = element_text(size = 10),
                  legend.title = element_text(size = 10))
ggsave("goal35_2years.jpg")
Saving 7.29 x 4.51 in image

#Compare info packs by year
ggplot() +
  geom_line(data = seventeen_eighteen_app_values, aes(x = date, y = goal12Completions), colour = "violetred3") +
  geom_line(data = eighteen_nineteen_app_values, aes(x = date, y = goal12Completions), colour = "springgreen3") +
  labs(x = "Date", y = "Number of Info Pack Requests") +
  theme(title = element_text(size = 12, face = "bold"),
                  axis.title = element_text(size = 12, face = "bold"),
                  axis.text = element_text(size = 10),
                  legend.title = element_text(size = 10))
ggsave("goal12_2years.jpg")
Saving 7.29 x 4.51 in image

#Plot apps for 2017/18
all_years_app_values %>%
  filter(FY == "2017/18")  %>%
  ggplot() +
  aes(x = date, y = goal9Completions) +
  geom_line()

#Plot apps for 2018/19
all_years_app_values %>%
  filter(FY == "2018/19")  %>%
  ggplot() +
  aes(x = date, y = goal9Completions) +
  geom_line()

LS0tCnRpdGxlOiAiUGFydF8xX25vdGVib29rIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7cn0KbGlicmFyeShnb29nbGVBbmFseXRpY3NSKQpsaWJyYXJ5KGtleXJpbmcpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGdncHVicikKYGBgCgpgYGB7cn0KI0dldCBkYXRhIGZvciBGWTIwMTctMjAxOCBmb3Igc2Vzc2lvbnMgYW5kIGdvYWwgY29tcGxldGlvbnMgYnkgZGF0ZQpzZXZlbnRlZW5fZWlnaHRlZW5fYXBwX3ZhbHVlcyA8LSByZWFkX2NzdigiLi4vaW5wdXRzL3NldmVudGVlbl9laWdodGVlbl9hcHBzLmNzdiIpCmBgYAoKYGBge3J9CnN1bW1hcnkoc2V2ZW50ZWVuX2VpZ2h0ZWVuX2FwcF92YWx1ZXMpCmBgYAoKYGBge3J9CiNQbG90IGFwcGxpY2F0aW9uIHZhbHVlcyBhZ2FpbnN0IG1vbnRoIApnZ3Bsb3Qoc2V2ZW50ZWVuX2VpZ2h0ZWVuX2FwcF92YWx1ZXMpICsKICBhZXMoeCA9IG1vbnRoLCB5ID0gZ29hbDlDb21wbGV0aW9ucykgKwogIGdlb21fY29sKCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDQ1LCBjb2xvdXIgPSAicmVkIikKYGBgCgpgYGB7cn0KI1Bsb3QgYXBwIHZhbHVlcyBhZ2FpbnN0IGRheSBvZiB3ZWVrCmdncGxvdChzZXZlbnRlZW5fZWlnaHRlZW5fYXBwX3ZhbHVlcykgKwogIGFlcyh4ID0gZGF5b2ZXZWVrTmFtZSwgeSA9IGdvYWw5Q29tcGxldGlvbnMpICsKICBnZW9tX2NvbCgpIApgYGAKCmBgYHtyfQojUGxvdCBhcHAgdmFsdWVzICBhbmQgc2Vzc2lvbnMgb3ZlciBlbnRpcmUgeWVhcgphcHBfc2V2ZW50ZWVuX3Bsb3QgPC0gZ2dwbG90KCkgKwogIGdlb21fbGluZShkYXRhID0gc2V2ZW50ZWVuX2VpZ2h0ZWVuX2FwcF92YWx1ZXMsIAogICAgICAgICAgIGFlcyh4ID0gZGF0ZSwgeSA9IGdvYWw5Q29tcGxldGlvbnMpKSArCiAgbGFicyh4ID0gIkRhdGUiLCB5ID0gIkFwcGxpY2F0aW9ucyIpCgpzZXNzaW9uc19zZXZlbnRlZW5fcGxvdCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBzZXZlbnRlZW5fZWlnaHRlZW5fYXBwX3ZhbHVlcywgCiAgICAgICAgICAgYWVzKHggPSBkYXRlLCB5ID0gc2Vzc2lvbnMpKSArCiAgbGFicyh4ID0gIkRhdGUiLCB5ID0gIlNlc3Npb25zIikKCmdnYXJyYW5nZShzZXNzaW9uc19zZXZlbnRlZW5fcGxvdCwgYXBwX3NldmVudGVlbl9wbG90LAogICAgICAgICAgbmNvbCA9IDEsIG5yb3cgPSAyKQpnZ3NhdmUoInNldmVudGVlbl9zZXNzaW9ucy5qcGciKQpgYGAKCgpgYGB7cn0KI1Bsb3QgYXBwIHZhbHVlcyBhbmQgaW5mbyBzZXNzaW9uIGNsaWNrcyBvdmVyIGVudGlyZSB5ZWFyCmdvYWwzX3NldmVudGVlbiA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBzZXZlbnRlZW5fZWlnaHRlZW5fYXBwX3ZhbHVlcywgCiAgICAgICAgICAgYWVzKHggPSBkYXRlLCB5ID0gZ29hbDNDb21wbGV0aW9ucywgY29sb3VyID0gImJsdWUiKSkgKwogIGdlb21fbGluZShkYXRhID0gc2V2ZW50ZWVuX2VpZ2h0ZWVuX2FwcF92YWx1ZXMsIAogICAgICAgICAgIGFlcyh4ID0gZGF0ZSwgeSA9IGdvYWw1Q29tcGxldGlvbnMsIGNvbG91ciA9ICJyZWQiKSkgKwogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJJbmZvIFNlc3Npb24gQ2xpY2tzIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCmdvYWw5X3NldmVudGVlbjwtIAogIGdncGxvdCgpKwogIGdlb21fbGluZShkYXRhID0gc2V2ZW50ZWVuX2VpZ2h0ZWVuX2FwcF92YWx1ZXMsIAogICAgICAgICAgIGFlcyh4ID0gZGF0ZSwgeSA9IGdvYWw5Q29tcGxldGlvbnMpKSArCiAgbGFicyh4ID0gIkRhdGUiLCB5ID0gIkFwcGxpY2F0aW9ucyIpCgpnZ2FycmFuZ2UoZ29hbDNfc2V2ZW50ZWVuLCBnb2FsOV9zZXZlbnRlZW4sCiAgICAgICAgICBuY29sID0gMSwgbnJvdyA9IDIpCmdnc2F2ZSgic2V2ZW50ZWVuX2dvYWwzNS5qcGciKQpgYGAKCmBgYHtyfQojUGxvdCBhcHAgdmFsdWVzICBhbmQgaW5mbyBwYWNrcyBvdmVyIGVudGlyZSB5ZWFyCmluZm9fcGFja3Nfc2V2ZW50ZWVuX3Bsb3QgPC0gZ2dwbG90KCkgKwogIGdlb21fbGluZShkYXRhID0gc2V2ZW50ZWVuX2VpZ2h0ZWVuX2FwcF92YWx1ZXMsIAogICAgICAgICAgIGFlcyh4ID0gZGF0ZSwgeSA9IGdvYWwxMkNvbXBsZXRpb25zLCBjb2xvdXIgPSAiYmx1ZSIpKSArCiAgbGFicyh4ID0gIkRhdGUiLCB5ID0gIkluZm8gUGFjayBSZXF1ZXN0cyIpICsKICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKZ2dhcnJhbmdlKGluZm9fcGFja3Nfc2V2ZW50ZWVuX3Bsb3QsIGdvYWw5X3NldmVudGVlbiwKICAgICAgICAgIG5jb2wgPSAxLCBucm93ID0gMikKZ2dzYXZlKCJzZXZlbnRlZW5fZ29hbDEyLmpwZyIpCmBgYAoKYGBge3J9CiNHZXQgY29ycmVsYXRpb25zIGJldHdlZW4gbWV0cmljcyBhbmQgYXBwIHZhbHVlcwpjb3Ioc2V2ZW50ZWVuX2VpZ2h0ZWVuX2FwcF92YWx1ZXMkZ29hbDlDb21wbGV0aW9ucywgc2V2ZW50ZWVuX2VpZ2h0ZWVuX2FwcF92YWx1ZXMkc2Vzc2lvbnMpCmNvcihzZXZlbnRlZW5fZWlnaHRlZW5fYXBwX3ZhbHVlcyRnb2FsOUNvbXBsZXRpb25zLCBzZXZlbnRlZW5fZWlnaHRlZW5fYXBwX3ZhbHVlcyRnb2FsM0NvbXBsZXRpb25zKQpjb3Ioc2V2ZW50ZWVuX2VpZ2h0ZWVuX2FwcF92YWx1ZXMkZ29hbDlDb21wbGV0aW9ucywgc2V2ZW50ZWVuX2VpZ2h0ZWVuX2FwcF92YWx1ZXMkZ29hbDVDb21wbGV0aW9ucykKY29yKHNldmVudGVlbl9laWdodGVlbl9hcHBfdmFsdWVzJGdvYWw5Q29tcGxldGlvbnMsIHNldmVudGVlbl9laWdodGVlbl9hcHBfdmFsdWVzJGdvYWwxMkNvbXBsZXRpb25zKQpgYGAKU3Ryb25nZXN0IGNvcnJlbGF0aW9uIGJldHdlZW4gc2Vzc2lvbnMgYW5kIGFwcCB2YWx1ZXMgYnV0IHdlYWsgLSBpbmZvIHBhY2tzIG5vdApyZWFsbHkgY29ycmVsYXRlZCwgdG9vIHdlYWsKCgpgYGB7cn0KI0dldCBkYXRhIGZvciBGWTIwMTgvMjAxOQplaWdodGVlbl9uaW5ldGVlbl9hcHBfdmFsdWVzIDwtICByZWFkX2NzdigiLi4vaW5wdXRzL2VpZ2h0ZWVuX25pbmV0ZWVuX2FwcHMuY3N2IikKYGBgCgpgYGB7cn0Kc3VtbWFyeShlaWdodGVlbl9uaW5ldGVlbl9hcHBfdmFsdWVzKQpgYGAKCmBgYHtyfQojQ3JlYXRlIGRhdGEgZnJhbWUgd2l0aCBib3RoIHllYXIncyBkYXRhCmFsbF95ZWFyc19hcHBfdmFsdWVzIDwtIApyYmluZChzZXZlbnRlZW5fZWlnaHRlZW5fYXBwX3ZhbHVlcywgZWlnaHRlZW5fbmluZXRlZW5fYXBwX3ZhbHVlcykKCmFsbF95ZWFyc19hcHBfdmFsdWVzIDwtIAphbGxfeWVhcnNfYXBwX3ZhbHVlcyAlPiUKICBtdXRhdGUoRlkgPSBjYXNlX3doZW4oCiAgICBtb250aCAlaW4lIGMoIjA0IiwgIjA1IiwgIjA2IiwgIjA3IiwgIjA4IiwgIjA5IiwgIjEwIiwgIjExIiwgIjEyIikgJiB5ZWFyID09ICIyMDE3IiB+ICIyMDE3LzE4IiwKICAgIG1vbnRoICVpbiUgYygiMDEiLCAiMDIiLCAiMDMiKSAmIHllYXIgPT0gIjIwMTgiIH4gIjIwMTcvMTgiLAogICAgbW9udGggJWluJSBjKCIwNCIsICIwNSIsICIwNiIsICIwNyIsICIwOCIsICIwOSIsICIxMCIsICIxMSIsICIxMiIpICYgeWVhciA9PSAiMjAxOCIgfiAiMjAxOC8xOSIsCiAgICBtb250aCAlaW4lIGMoIjAxIiwgIjAyIiwgIjAzIikgJiB5ZWFyID09ICIyMDE5IiB+ICIyMDE4LzE5IiwKICApKQpgYGAKCmBgYHtyfQpzdW0oYWxsX3llYXJzX2FwcF92YWx1ZXMkZ29hbDlDb21wbGV0aW9ucykKYGBgCgoKCmBgYHtyfQojUGxvdCBhcHAgdmFsdWVzIGZvciBlYWNoIG1vbnRoIGFuZCBjb21wYXJlIHRvIGxhc3QgeWVhcgphbGxfeWVhcnNfYXBwX3ZhbHVlcyAlPiUKICBncm91cF9ieShtb250aCwgRlkpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9hcHBzID0gc3VtKGdvYWw5Q29tcGxldGlvbnMpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9jb2woYWVzKHggPSBtb250aCwgeSA9IHRvdGFsX2FwcHMsIGZpbGwgPSBGWSksIHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInZpb2xldHJlZDMiLCAic3ByaW5nZ3JlZW4zIikpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA0NSkgKwogIGxhYnModGl0bGUgPSAiQXBwbGljYXRpb25zIHBlciBNb250aCIsIHggPSAiTW9udGgiLCB5ID0gIk51bWJlciBvZiBBcHBsaWNhdGlvbnMiKSArCiAgdGhlbWUodGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpCmdnc2F2ZSgiYXBwc19tb250aC5qcGciKQpgYGAKCmBgYHtyfQojUGxvdCBhcHBzIGJ5IGRheSBvZiB0aGUgd2VlayBhbmQgY29tcGFyZSB0byBsYXN0IHllYXIKYWxsX3llYXJzX2FwcF92YWx1ZXMgJT4lCiAgZ3JvdXBfYnkoZGF5b2ZXZWVrTmFtZSwgRlkpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9hcHBzID0gc3VtKGdvYWw5Q29tcGxldGlvbnMpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9jb2woYWVzKHggPSByZW9yZGVyKGRheW9mV2Vla05hbWUsIHRvdGFsX2FwcHMpLCB5ID0gdG90YWxfYXBwcywgZmlsbCA9IEZZKSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygidmlvbGV0cmVkMyIsICJzcHJpbmdncmVlbjMiKSkgKwogIGxhYnModGl0bGUgPSAiQXBwbGljYXRpb25zIHBlciBXZWVrIERheSIsIHggPSAiRGF5IiwgeSA9ICJOdW1iZXIgb2YgQXBwbGljYXRpb25zIikgKwogIHRoZW1lKHRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKQpnZ3NhdmUoImFwcHNfZGF5LmpwZyIpCmBgYAoKYGBge3J9CnN1bShzZXZlbnRlZW5fZWlnaHRlZW5fYXBwX3ZhbHVlcyRnb2FsOUNvbXBsZXRpb25zKQpzdW0oZWlnaHRlZW5fbmluZXRlZW5fYXBwX3ZhbHVlcyRnb2FsOUNvbXBsZXRpb25zKQpgYGAKCmBgYHtyfQojUGxvdCBhcHBzIGJ5IGRheSBvZiB0aGUgbW9udGggYW5kIGNvbXBhcmUgdG8gbGFzdCB5ZWFyCmFsbF95ZWFyc19hcHBfdmFsdWVzICU+JQogIGdyb3VwX2J5KGRheSwgRlkpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9hcHBzID0gc3VtKGdvYWw5Q29tcGxldGlvbnMpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9jb2woYWVzKHggPSBkYXksIHkgPSB0b3RhbF9hcHBzLCBmaWxsID0gRlkpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJ2aW9sZXRyZWQzIiwgInNwcmluZ2dyZWVuMyIpKSArCiAgbGFicyh0aXRsZSA9ICJBcHBsaWNhdGlvbnMgcGVyIE1vbnRoIERheSIsIHggPSAiRGF5IG9mIE1vbnRoIiwgeSA9ICJOdW1iZXIgb2YgQXBwbGljYXRpb25zIikgKwogIHRoZW1lKHRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKQpnZ3NhdmUoImFwcHNfbW9udGhfZGF5LmpwZyIpCmBgYAoKYGBge3J9CiNQbG90IHNlc3Npb25zIHZzIGFwcHMgZm9yIEZZMjAxOC8xOQphcHBfZWlnaHRlZW5fcGxvdCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBlaWdodGVlbl9uaW5ldGVlbl9hcHBfdmFsdWVzLCAKICAgICAgICAgICBhZXMoeCA9IGRhdGUsIHkgPSBnb2FsOUNvbXBsZXRpb25zKSkgICsKICBsYWJzKHggPSAiRGF0ZSIsIHkgPSAiQXBwbGljYXRpb25zIikKCnNlc3Npb25zX2VpZ2h0ZWVuX3Bsb3QgPC0gZ2dwbG90KCkgKwogIGdlb21fbGluZShkYXRhID0gZWlnaHRlZW5fbmluZXRlZW5fYXBwX3ZhbHVlcywgCiAgICAgICAgICAgYWVzKHggPSBkYXRlLCB5ID0gc2Vzc2lvbnMpKSArCiAgbGFicyh4ID0gIkRhdGUiLCB5ID0gIlNlc3Npb25zIikKCmdnYXJyYW5nZShzZXNzaW9uc19laWdodGVlbl9wbG90LCBhcHBfZWlnaHRlZW5fcGxvdCwKICAgICAgICAgIG5jb2wgPSAxLCBucm93ID0gMikKZ2dzYXZlKCJlaWdodGVlbl9zZXNzaW9ucy5qcGciKQpgYGAKCmBgYHtyfQojUGxvdCBhcHAgdmFsdWVzIGFuZCBpbmZvIHNlc3Npb24gY2xpY2tzIG92ZXIgZW50aXJlIHllYXIKaW5mb19jbGlja3NfZWlnaHRlZW5fcGxvdCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBlaWdodGVlbl9uaW5ldGVlbl9hcHBfdmFsdWVzLCAKICAgICAgICAgICBhZXMoeCA9IGRhdGUsIHkgPSBnb2FsM0NvbXBsZXRpb25zLCBjb2xvdXIgPSAiYmx1ZSIpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBlaWdodGVlbl9uaW5ldGVlbl9hcHBfdmFsdWVzLCAKICAgICAgICAgICBhZXMoeCA9IGRhdGUsIHkgPSBnb2FsNUNvbXBsZXRpb25zLCBjb2xvdXIgPSAicmVkIikpICsKICBsYWJzKHggPSAiRGF0ZSIsIHkgPSAiSW5mbyBTZXNzaW9uIENsaWNrcyIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgpnb2FsOV9laWdodGVlbl9wbG90IDwtIApnZ3Bsb3QoKSArCiAgIGdlb21fbGluZShkYXRhID0gZWlnaHRlZW5fbmluZXRlZW5fYXBwX3ZhbHVlcywgCiAgICAgICAgICAgYWVzKHggPSBkYXRlLCB5ID0gZ29hbDlDb21wbGV0aW9ucykpICsKbGFicyh4ID0gIkRhdGUiLCB5ID0gIkFwcGxpY2F0aW9ucyIpCgpnZ2FycmFuZ2UoaW5mb19jbGlja3NfZWlnaHRlZW5fcGxvdCwgZ29hbDlfZWlnaHRlZW5fcGxvdCwKICAgICAgICAgIG5jb2wgPSAxLCBucm93ID0gMikKZ2dzYXZlKCJlaWdodGVlbl9nb2FsMzUuanBnIikKYGBgCgpgYGB7cn0KI1Bsb3QgYXBwIHZhbHVlcyAgYW5kIGluZm8gcGFja3Mgb3ZlciBlbnRpcmUgeWVhcgppbmZvX3BhY2tzX2VpZ2h0ZWVuX3Bsb3QgPC0gZ2dwbG90KCkgKwogIGdlb21fbGluZShkYXRhID0gZWlnaHRlZW5fbmluZXRlZW5fYXBwX3ZhbHVlcywgCiAgICAgICAgICAgYWVzKHggPSBkYXRlLCB5ID0gZ29hbDEyQ29tcGxldGlvbnMsIGNvbG91ciA9ICJyZWQiKSkgKwogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJJbmZvIFBhY2sgUmVxdWVzdHMiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKZ2dhcnJhbmdlKGluZm9fcGFja3NfZWlnaHRlZW5fcGxvdCwgZ29hbDlfZWlnaHRlZW5fcGxvdCwKICAgICAgICAgIG5jb2wgPSAxLCBucm93ID0gMikKCmdnc2F2ZSgiZWlnaHRlZW5fZ29hbDEyLmpwZyIpCmBgYAoKYGBge3J9CiNHZXQgY29ycmVsYXRpb25zIGJldHdlZW4gbWV0cmljcyBhbmQgYXBwIHZhbHVlcwpjb3IoZWlnaHRlZW5fbmluZXRlZW5fYXBwX3ZhbHVlcyRnb2FsOUNvbXBsZXRpb25zLCBlaWdodGVlbl9uaW5ldGVlbl9hcHBfdmFsdWVzJHNlc3Npb25zKQpjb3IoZWlnaHRlZW5fbmluZXRlZW5fYXBwX3ZhbHVlcyRnb2FsOUNvbXBsZXRpb25zLCBlaWdodGVlbl9uaW5ldGVlbl9hcHBfdmFsdWVzJGdvYWwzQ29tcGxldGlvbnMpCmNvcihlaWdodGVlbl9uaW5ldGVlbl9hcHBfdmFsdWVzJGdvYWw5Q29tcGxldGlvbnMsIGVpZ2h0ZWVuX25pbmV0ZWVuX2FwcF92YWx1ZXMkZ29hbDVDb21wbGV0aW9ucykKY29yKGVpZ2h0ZWVuX25pbmV0ZWVuX2FwcF92YWx1ZXMkZ29hbDlDb21wbGV0aW9ucywgZWlnaHRlZW5fbmluZXRlZW5fYXBwX3ZhbHVlcyRnb2FsMTJDb21wbGV0aW9ucykKYGBgCgpgYGB7cn0KI0NvbXBhcmUgYXBwbGljYXRpb25zIGZvciBlYWNoIHllYXIKZ2dwbG90KCkgKwogIGdlb21fbGluZShkYXRhID0gc2V2ZW50ZWVuX2VpZ2h0ZWVuX2FwcF92YWx1ZXMsIGFlcyh4ID0gZGF0ZSwgeSA9IGdvYWw5Q29tcGxldGlvbnMpLCBjb2xvdXIgPSAidmlvbGV0cmVkMyIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGVpZ2h0ZWVuX25pbmV0ZWVuX2FwcF92YWx1ZXMsIGFlcyh4ID0gZGF0ZSwgeSA9IGdvYWw5Q29tcGxldGlvbnMpLCBjb2xvdXIgPSAic3ByaW5nZ3JlZW4zIikgKwogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJOdW1iZXIgb2YgQXBwbGljYXRpb25zIikgKwogIHRoZW1lKHRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKQpnZ3NhdmUoImFwcHNfMnllYXJzLmpwZyIpCmBgYAoKCmBgYHtyfQojQ29tcGFyZSBzZXNzaW9ucyBmb3IgZWFjaCB5ZWFyCmdncGxvdCgpICsKICBnZW9tX2xpbmUoZGF0YSA9IHNldmVudGVlbl9laWdodGVlbl9hcHBfdmFsdWVzLCBhZXMoeCA9IGRhdGUsIHkgPSBzZXNzaW9ucyksIGNvbG91ciA9ICJ2aW9sZXRyZWQzIikgKwogIGdlb21fbGluZShkYXRhID0gZWlnaHRlZW5fbmluZXRlZW5fYXBwX3ZhbHVlcywgYWVzKHggPSBkYXRlLCB5ID0gc2Vzc2lvbnMpLCBjb2xvdXIgPSAic3ByaW5nZ3JlZW4zIikgKwogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJOdW1iZXIgb2YgU2Vzc2lvbnMiKSArCiAgdGhlbWUodGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpCmdnc2F2ZSgic2Vzc2lvbl8yeWVhcnMuanBnIikKYGBgCgpgYGB7cn0KI0NvbXBhcmUgaW5mbyBjbGlja3MgZm9yIGVhY2ggeWVhcgpnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBzZXZlbnRlZW5fZWlnaHRlZW5fYXBwX3ZhbHVlcywgYWVzKHggPSBkYXRlLCB5ID0gZ29hbDNDb21wbGV0aW9ucyksIGNvbG91ciA9ICJyZWQiKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBzZXZlbnRlZW5fZWlnaHRlZW5fYXBwX3ZhbHVlcywgYWVzKHggPSBkYXRlLCB5ID0gZ29hbDVDb21wbGV0aW9ucyksIGNvbG91ciA9ICJibHVlIikgKwogIGdlb21fbGluZShkYXRhID0gZWlnaHRlZW5fbmluZXRlZW5fYXBwX3ZhbHVlcywgYWVzKHggPSBkYXRlLCB5ID0gZ29hbDNDb21wbGV0aW9ucyksIGNvbG91ciA9ICJ5ZWxsb3ciKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBlaWdodGVlbl9uaW5ldGVlbl9hcHBfdmFsdWVzLCBhZXMoeCA9IGRhdGUsIHkgPSBnb2FsNUNvbXBsZXRpb25zKSwgY29sb3VyID0gImdyZWVuIikgKwogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJOdW1iZXIgb2YgSW5mbyBTZXNzaW9uIENsaWNrcyIpICsKICB0aGVtZSh0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkKZ2dzYXZlKCJnb2FsMzVfMnllYXJzLmpwZyIpCmBgYAoKYGBge3J9CiNDb21wYXJlIGluZm8gcGFja3MgYnkgeWVhcgpnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBzZXZlbnRlZW5fZWlnaHRlZW5fYXBwX3ZhbHVlcywgYWVzKHggPSBkYXRlLCB5ID0gZ29hbDEyQ29tcGxldGlvbnMpLCBjb2xvdXIgPSAidmlvbGV0cmVkMyIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGVpZ2h0ZWVuX25pbmV0ZWVuX2FwcF92YWx1ZXMsIGFlcyh4ID0gZGF0ZSwgeSA9IGdvYWwxMkNvbXBsZXRpb25zKSwgY29sb3VyID0gInNwcmluZ2dyZWVuMyIpICsKICBsYWJzKHggPSAiRGF0ZSIsIHkgPSAiTnVtYmVyIG9mIEluZm8gUGFjayBSZXF1ZXN0cyIpICsKICB0aGVtZSh0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkKZ2dzYXZlKCJnb2FsMTJfMnllYXJzLmpwZyIpCmBgYAoKYGBge3J9CiNQbG90IGFwcHMgZm9yIDIwMTcvMTgKYWxsX3llYXJzX2FwcF92YWx1ZXMgJT4lCiAgZmlsdGVyKEZZID09ICIyMDE3LzE4IikgICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IGRhdGUsIHkgPSBnb2FsOUNvbXBsZXRpb25zKSArCiAgZ2VvbV9saW5lKCkKYGBgCgpgYGB7cn0KI1Bsb3QgYXBwcyBmb3IgMjAxOC8xOQphbGxfeWVhcnNfYXBwX3ZhbHVlcyAlPiUKICBmaWx0ZXIoRlkgPT0gIjIwMTgvMTkiKSAgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gZGF0ZSwgeSA9IGdvYWw5Q29tcGxldGlvbnMpICsKICBnZW9tX2xpbmUoKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==